package com.lq.service;

import com.lq.constant.Contant;
import com.lq.dao.UserDao;
import com.lq.entity.User;
import com.lq.exception.PasswordIncorrectException;
import com.lq.exception.UserIsExistException;
import com.lq.exception.UserIsNotExistException;
import com.lq.exception.UserRegisterException;
import com.lq.util.MD5Util;

import java.util.List;

//对封装的user对象进行处理，并调用Dao层写入数据库
public class UserService {

    UserDao userdao = new UserDao();

    public void register(User user) {
        if(user.getUsername().isEmpty() || user.getPassword().isEmpty() || user.getProfile().isEmpty()){
            throw new UserRegisterException("用户名不能为空！！！");
        }else{
            //实质是向数据库插入数据
            //设计密码，撒盐（加入我们设置的一个任意字符串，防止被暴力破解
            user.setPassword(user.getUsername() + user.getPassword() + Contant.SALT);
            user.setPassword(MD5Util.digest(user.getPassword()));

            //只通过前端异步显示只是做了展示工作，真正的拦截工作需要放到后端，
            //如果已经存在了，我们就抛出 一个异常给controller层的RegisterServlet，并重定向到新的页面
            List<User> userbyName = userdao.findUserByName(user.getUsername());
            if(userbyName.size()>0) {
                throw new UserIsExistException();
            }else{
                userdao.save(user);
            }
        }

    }

    //检查名字是否已经存在
    public Boolean CheckUserName(String username) {
        List<User> users = userdao.findUserByName(username);
        return users.size() > 0;
    }



    //更具用户名返回头像
    public String getProfile(String username) {
        List<User> users = userdao.findUserByName(username);
        //这里默认处理的是，你都存进来了所以一定是只有一个元素，所以取第一个的profile
        if(users.size()>0) {
            return users.get(0).getProfile();
        }
        return null;

    }

    public void login(User user) {
        List<User> users = userdao.findUserByName(user.getUsername());
        if(users.size() == 0) {
            throw new UserIsNotExistException();
        }
        User realUser = users.get(0);
        //我们需要进行加盐加密的处理
        if(user.getUsername()!=null && user.getPassword()!=null) {
            String password = user.getUsername() + user.getPassword() + Contant.SALT;
            password = MD5Util.digest(password);
            if(!password.equals(realUser.getPassword())) {
                throw new PasswordIncorrectException();
            }
        }


    }

    //对于业务来说就是要把所有的用户信息拿到，对于dao层来说就是要去数据库查找出所有的用户
    //你会发现下面这个只有一行代码能不能不写，直接在servlet的controll层直接调用dao层呢？答案是不能，
    //这是mvc规范，每一层哪怕做的再少，我们也要按部就班得写
    public List<User> findAllUsers() {
        return userdao.findALLUsers();
    }

    public void deleteById(String id) {
        userdao.deleteById(id);
    }

    public User findUserById(Integer id) {
        return userdao.findUserByid(id);
    }

    public Integer update(User user) {
        return userdao.update(user);
    }
}
